Skip to content

feat(project-board): decision levels and identities on the board - #1841

Merged
Birfy merged 2 commits into
mainfrom
dev/1831-decision-levels
Oct 30, 2026
Merged

Birfy merged 2 commits into
mainfrom
dev/1831-decision-levels

Conversation

@Birfy

@Birfy Birfy commented Oct 30, 2026 •

Copy link
Copy Markdown
Collaborator

Written-by: Dev

Fixes #1831
Owner: Chief
Reviewer: Reviewer
Tip SHA: 3cca5d9
Base: b4e05ac
Docs-not-needed: no — docs/subsystems/core-host.md and docs/subsystems/core-client.md carry the two new sections.

What changed

What Why Files
A meeting accepts level (ordinary/major/severe, unknown refused) and recipients, keeps both across decide, and writes them into the decision file Issue §2–3: a card must say how binding it is and who it is addressed to core/src/host/meetings.js
advanceRefusal refuses only severe, with the reason (dissenting count, else the Owner confirms); decisionCardOf puts level, recipients and advance: {allowed, reason} on every pending and decided row A severe card must not advance silently, and the reason has to be host truth, not client guesswork core/src/host/meetings.js, core/src/host/project-board.js
A board row carries holder (the claim) and speaksFor (the user an Assistant writes for) The three identities (Bot claim, Assistant, project automation Written-by:) may not read as one core/src/host/project-board.js
The pending card draws a level badge, its @recipients and the host's pause reason; a row draws its holder and for <user>; zh keys added Issue §3: the board must show the level and who speaks for whom core/src/client/project-board.js, core/src/client/i18n.js, core/client.js
Unit tests for level validation, the severe refusal, the card projection and the rendered badge/recipients/identities The acceptance line for this slice core/test/project-board-levels.test.js
Subsystem docs for both halves; generated patches/ds-bot/ mirrors; bundle rebuilt arch-docs owns these paths; core must equal ds-bot + patches docs/subsystems/core-host.md, docs/subsystems/core-client.md, patches/ds-bot/*

Red-first: with core/src/host/meetings.js and project-board.js restored to their base blobs, node --test test/project-board-levels.test.js fails at load (no decisionLevel/decisionCardOf); with the tip back it passes 4/4.

Ran

  • cd core && TZ=UTC node --test test/project-board-levels.test.js — 4/4 green at the tip; red at the base blobs.
  • TZ=UTC node scripts/ds-bot-patches.mjs check — 10 patches apply cleanly; core/ equals ds-bot/ + patches.
  • TZ=UTC node core/scripts/build-client.mjs --check — green.
  • TZ=UTC npm run verify — lint 0 errors (72 pre-existing warnings); arch-docs then stops with cannot diff against origin/main because this box has no git binary.

Not run

  • The smoke bench (no index.js change).
  • The full core suite here: this box's network made the network-touching tests stall; CI's tests-ok is the authority.

Checkpoint

{
  "pr": 1841,
  "claim": "Chief",
  "issue": 1831,
  "summary": "A decision card now carries a level (ordinary, major, severe) and the recipients it is addressed to. The host refuses to advance a severe card automatically and answers the reason; the board shows the badge, the recipients and that reason beside every pending card. A row names the Bot holding the claim and the user an Assistant speaks for, so project automation, a claim holder and a person never read as one identity.",
  "files": ["core/src/host/meetings.js", "core/src/host/project-board.js", "core/src/client/project-board.js", "core/test/project-board-levels.test.js"],
  "checks": { "ran": "node --test test/project-board-levels.test.js; node scripts/ds-bot-patches.mjs check; node core/scripts/build-client.mjs --check", "result": "green", "at": "3cca5d9f47d01a6fc77567ec983e912489f1bfa8" },
  "next": "Reviewer: judge the tip; CI's tests-ok carries the full suite, which this box cannot finish because arch-docs needs git against origin/main."
}

A decision card now carries a level (ordinary, major, severe) and the
recipients it is addressed to, and a severe card never advances on its
own: the host refuses it with a reason naming what holds it. The board
shows the badge and the recipients beside each pending card, and a row
names the Bot holding the claim and the user an Assistant speaks for, so
the three identities are never read as one.

Tests: core/test/project-board-levels.test.js (level validation, severe
refusal, the card projection and the rendered badge/recipients/identities).

Fixes #1831
@Birfy Birfy added the agent-pr Pull request opened by an agent label Oct 30, 2026
@Birfy Birfy self-assigned this Oct 30, 2026
The two subsystem pages that own the changed paths now describe the level
and recipient fields, the severe pause and the identity markers, and the
changelog fragment uses the kind the repo accepts (added).

Fixes #1831
@Birfy

Birfy commented Oct 30, 2026

Copy link
Copy Markdown
Collaborator Author

Verdict: PASS at 3cca5d9
Written-by: Reviewer
Attestation: 3cca5d9 role=Reviewer

Ran at this tip:

$ cd core && TZ=UTC node --test test/project-board-levels.test.js
# tests 4  # pass 4  # fail 0
$ cd core && TZ=UTC node --test test/project-board-levels.test.js test/meetings.test.js test/meetings-decide-paths.test.js test/meetings-persist.test.js test/decisions.test.js test/project-board.test.js test/project-board-view.test.js test/project-board-panels.test.js test/project-board-entry.test.js test/board-card.test.js test/no-delivery-board.test.js
# tests 92  # pass 92  # fail 0
$ node .github/scripts/changelog.mjs check
$ node scripts/ds-bot-patches.mjs check
$ node core/scripts/build-client.mjs --check
$ node .github/scripts/risk-gate.mjs --pr 1841 --repo ThinkFlowLab/FlyBot

Review (2026-10-30T15:30Z, tier T3):

  • Red-first, verified on a clean tip tree: with core/src/host/meetings.js and core/src/host/project-board.js restored to their base blobs the affected suite fails at load — not ok 1 - test/project-board-levels.test.js (# tests 1 / # pass 0 / # fail 1); with the tip blobs back it is # tests 4 / # pass 4 / # fail 0. The tip blob shas were checked against the API: 513d048 meetings.js, d05ba2a host/project-board.js, 386a1a7 client/project-board.js.
  • changelog.mjs check — 9 fragments well formed; ds-bot-patches check — 10 patches apply, core/ equals ds-bot/ + patches/ds-bot/; build-client.mjs --check — green (client.js matches src/client).
  • Check-runs at the tip: every check terminal. Only enqueue-guard is red, with no Verifier report names the tip 3cca5d9f47d0 — the expected pre-PASS state this report answers; nothing else failed. (tests-ok, merge-gate, risk tier, package, three plugin suites, Node 24, reviewed tip, judge all green; the second agent-audience run is cancelled.)
  • Scope: the compare b4e05ac…3cca5d9 is exactly the 15 files the body names — core/src/host/{meetings,project-board}.js, core/src/client/{project-board,i18n}.js, core/client.js, core/test/project-board-levels.test.js, the two subsystem docs, changelog.d fragment, and the generated patches/ds-bot mirrors. No unrelated core/ file and no patches/ds-bot/ change that is not a mirror of these sources.
  • Content: level is validated against the shared CLASSES vocabulary and unknown values are refused; decide keeps a level it was not given; advanceRefusal refuses only severe and names the dissent count, so the pause reason is host truth; decisionCardOf is one exported projection used by both the read model and the test; holder/speaksFor come from task.claimedBy/task.speaksFor and are omitted when empty, so older rows render unchanged. Client renders badge, recipients, pause reason, holder and for <user> with zh keys; nothing is inferred on the client.
  • Checkpoint block reads: pr 1841, claim Chief, issue 1831, summary 420 chars, 4 files all in this diff, checks.result green at the tip, whole block 1089 chars. Reviewer: Reviewer and Owner: Chief are both in the body header and name different Bots.
  • Non-blocking note: patches/ds-bot/0008-client-bundle.patch was regenerated on a box without git, so its hunk headers lost their trailing section context and the diff decomposition differs from main's even though the reconstructed core/client.js changes only 34/2 lines. ds-bot-patches check is green, so the tree is consistent; it is churn to keep in mind for the next conflict in that file, not a defect.

Not run: the smoke bench (no index.js/src/host wiring change) and the full core suite beyond the 92 affected tests — this box has no git, so arch-docs cannot diff against origin/main; CI's tests-ok at this tip is green and carries the full suite.

@github-actions github-actions Bot added the pass label Oct 30, 2026
@Birfy
Birfy added this pull request to the merge queue Oct 30, 2026
Merged via the queue into main with commit 28e887b Oct 30, 2026
13 of 14 checks passed
@Birfy
Birfy deleted the dev/1831-decision-levels branch October 30, 2026 15:18
@github-actions github-actions Bot removed the agent-pr Pull request opened by an agent label Oct 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

项目运作逻辑:Chief 与 Project Assistant 的身份边界、决策分级落到看板

1 participant